﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace inf_1007_devoir3
{
    public partial class frmLocation : Form
    {
        private frmListeLocations frmListe;
        private Location oldLocation;
        private Location location;
        private Client client;
        private Vehicule vehicule;
        private bool termine;

        public frmLocation(frmListeLocations frmListe)
        {
            this.frmListe = frmListe;
            termine = false;
            InitializeComponent();
        }

        public frmLocation(frmListeLocations frmListe, Location location)
        {
            this.frmListe = frmListe;
            termine = false;
            this.location = location;
            
            //Copie de la location dans un autre objet pour pouvoir remettre les anciennes valeurs en cas d'annulation
            oldLocation = new Location();
            location.copier(oldLocation);

            client = location.getClient();
            vehicule = location.getVehicule();
            InitializeComponent();
        }

        private void txtNoPermis_TextChanged(object sender, EventArgs e)
        {
            string noPermis = txtNoPermis.Text.Trim();

            client = CtrlClient.getInstance().getClient(noPermis);

            if (client != null)
            {
                txtDescClient.Text = client.ToStringComplet();
            }
            else
            {
                txtDescClient.Text = "";
            }
        }

        private void txtNoVehicule_TextChanged(object sender, EventArgs e)
        {
            rechercheVehicule();
        }

        private void rechercheVehicule()
        { 
            int noLocation = 0;
            try
            {
                noLocation = Convert.ToInt32(txtNoVehicule.Text.Trim());
            }
            catch (Exception e)
            {
            
            }

            if (noLocation != 0)
            { 
                vehicule = CtrlVehicule.getInstance().getVehicule(noLocation);
            }

            remplirInfoVehicule();
        }

        private void remplirInfoVehicule()
        {
            if (vehicule == null)
            {
                txtDescVehicule.Text = "";
                gbPeriode.Enabled = false;
                gbKilometrage.Enabled = false;
                dtpFin.Value = DateTime.Today;
                txtKilometrage.Text = "";
            }
            else
            {
                txtDescVehicule.Text = vehicule.ToStringComplet();
                gbPeriode.Enabled = true;
                gbKilometrage.Enabled = true;
                txtKilometrage.Text = vehicule.getKilometrage().ToString();
                dtpFin.Value = DateTime.Today;
            }
        }

        private void frmLocation_Load(object sender, EventArgs e)
        {
            txtDateDebut.Text = DateTime.Today.ToLongDateString();
            dtpFin.MinDate = DateTime.Today;

            if (location != null)
            {
                txtNoPermis.Text = client.getNoPermisConduire();
                txtNoVehicule.Text = vehicule.getNoLocation().ToString();

                txtKilometrage.Text = location.getKilometrageDepart().ToString();
                txtDateDebut.Text = location.getDateDebut().ToString();
                dtpFin.Value = location.getDateFin();
            }
        }

        private void btnLouer_Click(object sender, EventArgs e)
        {
            if (valider())
            {
                termine = true;
                
                if (location == null)
                    location = CtrlLocation.getInstance().creerLocation(client, vehicule, DateTime.Today, dtpFin.Value, Convert.ToInt32(txtKilometrage.Text.Trim()));

                //TODO: Ajouter le code pour modifier une location et créer une copie de l'ancienne au cas ou l'opération serait annulée

                CtrlLocation.getInstance().passerAuPaiement(frmListe, this, location);
            }
        }

        private bool valider()
        {
            error.Clear();
            
            bool valide = true;
            
            if (client == null)
            {
                error.SetError(txtNoPermis, "Veuillez entrer un numéro de permis valide.");
                valide = false;
            }
            if (vehicule == null)
            {
                error.SetError(txtNoVehicule, "Veuillez entrer un numéro de véhicule valide ou effectuer une recherche de véhicule.");
                valide = false;
            }
            else 
            {
                int kilometrage = -1;

                try
                {
                    kilometrage = Convert.ToInt32(txtKilometrage.Text.Trim());
                }
                catch (Exception e) { }

                if (kilometrage == -1)
                {
                    error.SetError(txtKilometrage, "Veuillez entrer un kilométrage au format numérique.");
                    valide = false;
                }
                else if (kilometrage < vehicule.getKilometrage())
                {
                    error.SetError(txtKilometrage, "Veuillez entrer un kilométrage supérieur ou égal à l'ancien kilométrage du véhicule.");
                    valide = false;
                }
            }

            return valide;
        }

        private void btnAnnuler_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void frmLocation_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (oldLocation != null && !termine)
            {
                oldLocation.copier(location);
            }
        }

        private void btnRechercheVehicule_Click(object sender, EventArgs e)
        {
            frmRechercheVehicule frm = new frmRechercheVehicule(this);

            frm.ShowDialog();
        }

        public void setTxtNoVehicule(string no)
        {
            txtNoVehicule.Text = no;
        }
    }
}
